package io.adrainty.algorithm.mars;

/**
 * 小E的怪物挑战
 * @link <a href="https://www.marscode.cn/practice/364l85wv6oo6lq?problem_id=7424418560666877996">...</a>
 * @author AdRainty
 * @version V1.0.0
 * @since 2024/11/21 下午11:33
 */
public class Solution006 {

    private Solution006() {}

    /**
     * @param n 怪物数量
     * @param hp 小E的生命值
     * @param atr 小E的攻击力
     * @param h 怪物的生命值
     * @param a 怪物的攻击力
     * @return int 最多能击败多少怪物
     */
    public static int solution(int n, int hp, int atr, int[] h, int[] a) {
        return solutionHelper(n, hp, atr, h, a, 0, 0, 0);
    }

    /**
     * 递归
     * @param h 当前生命值
     * @param a 攻击力
     * @param hp 所有怪物HP集合
     * @param atr 所有怪物攻击力集合
     * @param currentIndex 当前怪物索引
     * @param preAtk 上一个怪物的攻击力
     * @return int 最多能击败多少怪物
     */
    private static int solutionHelper(int n, int h, int a, int[] hp, int[] atr, int currentIndex, int preHp, int preAtk) {
        if (currentIndex >= n) return 0;   // 没怪物能打了
        System.out.printf("当前索引：%d, 当前生命值：%d, 当前攻击力：%d%n", currentIndex, h, a);
        int monsterHp = hp[currentIndex];
        int monsterAtk = atr[currentIndex];

        // 选择是否打怪物
        int countWithMonster = 0;
        // 只有当前怪物攻击力大于上一个怪物攻击力的时候，才能打哦
        if (monsterAtk > preAtk && monsterHp > preHp && h > monsterHp && a > monsterAtk) {
            // 打过怪物 获得增益
            // System.out.printf("打过怪物[Hp: %d, 怪物Attr: %d]! 获得增益, 当前生命值：%d，当前攻击力：%d%n", monsterHp, monsterAtk, h + monsterHp, a + monsterAtk);
            // countWithMonster = 1 + solutionHelper(n, h + monsterHp, a + monsterAtk, hp, atr, currentIndex + 1, monsterHp, monsterAtk);
            System.out.printf("打过怪物[Hp: %d, 怪物Attr: %d]! 当前生命值：%d，当前攻击力：%d%n", monsterHp, monsterAtk, h, a);
            countWithMonster = 1 + solutionHelper(n, h, a, hp, atr, currentIndex + 1, monsterHp, monsterAtk);
        }
        // 没打倒怪物, 没有增益, 直接进入下一层
        int countWithoutMonster = solutionHelper(n, h, a, hp, atr , currentIndex + 1, preHp, preAtk);
        return Math.max(countWithoutMonster, countWithMonster);
    }

}
